﻿using System;

using System.Collections.Generic;
using System.Text;
using Acid.OpenGLES;
namespace Acid.Graphics
{
    #region Device

    /// <summary>
    /// Clear Flags for the Device
    /// </summary>
    public enum ClearFlags : int
    {
        Color             = gl.GL_COLOR_BUFFER_BIT,
        Depth             = gl.GL_DEPTH_BUFFER_BIT,
        Stencil           = gl.GL_STENCIL_BUFFER_BIT
    }

    /// <summary>
    /// The Topology for the Input Vertices.
    /// </summary>
    public enum Topology : int
    {
        Points            = gl.GL_POINTS,
        Lines             = gl.GL_LINES,
        Triangles         = gl.GL_TRIANGLES,
        LineLoop          = gl.GL_LINE_LOOP,

    }

    #endregion

    
 

    #region Textures

    /// <summary>
    /// The type of Texture Filtering to be used.
    /// </summary>
    public enum TextureFilter : int
    {
        /// <summary>
        /// Faster Rendering, Lower Quality (Good for GPGPU)
        /// </summary>
        Nearest = gl.GL_NEAREST,
        /// <summary>
        /// Slower Rendering, Higher Quality. (Used mostly except in cases of GPGPU)
        /// </summary>
        Linear  = gl.GL_LINEAR
    }

    #endregion


    #region Vertex Declarations

    /// <summary>
    /// <para>GLSL Bindings</para>
    /// <para>Part of the Vertex Declaration. When passing streams of Vertex
    /// data to the GPU, there needs to be a mapping between the GLSL sematics
    /// and the element. This specifies what element corrosponds
    /// to what GLSL binding.</para>
    /// </summary>
    public enum ElementBinding
    {
        /// <summary>
        /// gl_Vertex
        /// </summary>
        Vertex,
        /// <summary>
        /// gl_Normal
        /// </summary>
        Normal,
        /// <summary>
        /// gl_Color
        /// </summary>
        Color,
        /// <summary>
        /// gl_MultiTexCoord2
        /// </summary>
        TexCoord0,
        /// <summary>
        /// gl_MultiTexCoord1
        /// </summary>
        TexCoord1,
        /// <summary>
        /// gl_MultiTexCoord2
        /// </summary>
        TexCoord2,
        /// <summary>
        /// gl_MultiTexCoord3
        /// </summary>
        TexCoord3,
        /// <summary>
        /// gl_MultiTexCoord4
        /// </summary>
        TexCoord4,
        /// <summary>
        /// gl_MultiTexCoord5
        /// </summary>
        TexCoord5,
        /// <summary>
        /// gl_MultiTexCoord6
        /// </summary>
        TexCoord6,
        /// <summary>
        /// gl_MultiTexCoord7
        /// </summary>
        TexCoord7,
        /// <summary>
        /// gl_MultiTexCoord8
        /// </summary>
        TexCoord8,
        /// <summary>
        /// gl_MultiTexCoord9
        /// </summary>
        TexCoord9,
        /// <summary>
        /// gl_MultiTexCoord10
        /// </summary>
        TexCoord10,
        /// <summary>
        /// gl_MultiTexCoord11
        /// </summary>
        TexCoord11,
        /// <summary>
        /// gl_MultiTexCoord12
        /// </summary>
        TexCoord12,
        /// <summary>
        /// gl_MultiTexCoord13
        /// </summary>
        TexCoord13,
        /// <summary>
        /// gl_MultiTexCoord14
        /// </summary>
        TexCoord14,
        /// <summary>
        /// gl_MultiTexCoord15
        /// </summary>
        TexCoord15

    }

    /// <summary>
    /// <para>Element Type</para>
    /// <para>Specifies the Type of the Vertex Element being passed to the GPU. In most cases the ElementType
    /// will be of type Float. However, there are instances where other types will be useful as part of a vertex stream</para>
    /// <para>Note: According to the OpenGL 3.0 prelimanary spec, there is talk about double precision being removed.
    /// The use of double precision should be discouraged.</para>
    /// </summary>
    public enum ElementType
    {
        Byte         = gl.GL_BYTE,
        UByte        = gl.GL_UNSIGNED_BYTE,
        Short        = gl.GL_SHORT,
        Float        = gl.GL_FLOAT,

    }

    #endregion

    #region State

    /// <summary>
    /// Defines a Hint
    /// </summary>
    public enum Hint
    {
        Fastest  = gl.GL_FASTEST,
        Nicest   = gl.GL_NICEST,
        DontCare = gl.GL_DONT_CARE
    }

    /// <summary>
    /// Defines a Face
    /// </summary>
    public enum Face
    {
        Front        = gl.GL_FRONT,
        Back         = gl.GL_BACK,
        FrontAndBack = gl.GL_FRONT_AND_BACK
    }

 

    /// <summary>
    /// Defines a Logic Op
    /// </summary>
    public enum LogicOp
    {
        Never          = gl.GL_NEVER,
        Always         = gl.GL_ALWAYS,
        LessThan       = gl.GL_LESS,
        EqualTo        = gl.GL_EQUAL,
        LessOrEqual    = gl.GL_LEQUAL,
                GreaterThan    = gl.GL_GREATER,
        NotEqual       = gl.GL_NOTEQUAL,
        GreaterOrEqual = gl.GL_GEQUAL  
    }

    /// <summary>
    /// Defines a Clipping Plane
    /// </summary>
    public enum ClipPlane
    {
        ClipPlane0 = gl.GL_CLIP_PLANE0,
        ClipPlane1 = gl.GL_CLIP_PLANE1,
        ClipPlane2 = gl.GL_CLIP_PLANE2,
        ClipPlane3 = gl.GL_CLIP_PLANE3,
        ClipPlane4 = gl.GL_CLIP_PLANE4,
        ClipPlane5 = gl.GL_CLIP_PLANE5
    }

    /// <summary>
    /// Defines a Src and Dst Factor
    /// </summary>
    public enum Factor
    {
        Zero                    = gl.GL_ZERO,
        One                     = gl.GL_ONE,
        DstColor                = gl.GL_DST_COLOR,
        OneMinusDstColor        = gl.GL_ONE_MINUS_DST_COLOR,
        SrcAlpha                = gl.GL_SRC_ALPHA,
        OneMinusSrcAlpha        = gl.GL_ONE_MINUS_SRC_ALPHA,
        DstAlpha                = gl.GL_DST_ALPHA,
        SrcAlphaSaturate        = gl.GL_SRC_ALPHA_SATURATE
    }

    #endregion

}
